﻿//using System;
//using System.Data.Entity;
//using System.Data.Entity.Infrastructure;
//using System.Linq;
//using System.Windows.Media.Imaging;
//using Brjnk.Maps;
//using Brjnk.Maps.Cache;
//using Microsoft.VisualStudio.TestTools.UnitTesting;

//namespace MapsTest
//{
//    [TestClass()]
//    public class MapStorageTest
//    {
//        private TestContext testContextInstance;

//        public TestContext TestContext
//        {
//            get
//            {
//                return testContextInstance;
//            }
//            set
//            {
//                testContextInstance = value;
//            }
//        }

//        #region Additional test attributes

//        //
//        //You can use the following additional attributes as you write your tests:
//        //
//        //Use ClassInitialize to run code before running the first test in the class
//        //[ClassInitialize()]
//        //public static void MyClassInitialize(TestContext testContext)
//        //{
//        //}
//        //
//        //Use ClassCleanup to run code after all tests in a class have run
//        //[ClassCleanup()]
//        //public static void MyClassCleanup()
//        //{
//        //}
//        //
//        //Use TestInitialize to run code before running each test
//        //[TestInitialize()]
//        //public void MyTestInitialize()
//        //{
//        //}
//        //
//        //Use TestCleanup to run code after each test has run
//        //[TestCleanup()]
//        //public void MyTestCleanup()
//        //{
//        //}
//        //

//        #endregion Additional test attributes

//        [TestMethod(), DeploymentItem("Maps\\Data\\10.png"), DeploymentItem("Maps\\Data\\20.png")]
//        public void MapStorageContextTest()
//        {
//            Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

//            using (MapStorageContext target = new MapStorageContext())
//            {
//                target.Database.Delete(); //smaže databázi po předchozím testu
//                var source = new SourceEntity() { ExpirationPeriodSec = int.MaxValue, Name = "TestSource" };
//                var source2 = new SourceEntity() { ExpirationPeriodSec = int.MaxValue, Name = "TestSource2" };
//                var source3 = new SourceEntity() { ExpirationPeriodSec = int.MaxValue, Name = "TestSource3" };

//                target.Sources.Add(source);
//                target.Sources.Add(source2);
//                target.Sources.Add(source3);

//                target.Tiles.Add(new TileEntity() { DownloadedTime = DateTime.Now, Image = null, Source = source, X = 2, Y = 2, Zoom = 2 });
//                target.Tiles.Add(new TileEntity() { DownloadedTime = DateTime.Now, Image = new byte[] { 2, 4, 6, 8 }, Source = source, X = 2, Y = 3, Zoom = 2 });
//                target.SaveChanges();
//            }

//            using (MapStorageContext target = new MapStorageContext())
//            {
//                Assert.AreEqual(2, target.Tiles.Count());
//                Assert.AreEqual(3, target.Sources.Count());
//                var source = target.Sources.ToArray()[0];

//                //testuje určení velikosti dat v DB
//                Assert.AreEqual(4, target.GetTotalImagesSize());
//                //Assert.AreEqual(0, target.GetImagesInRegionSize());

//                //testuje zda se odstranily dlaždice po odstranění jejich zdroje (ON DELETE CASCADE)
//                target.Sources.Remove(source);
//                target.SaveChanges();
//                Assert.AreEqual(0, target.Tiles.Count());

//                //Před spuštěním dalšího testu by se měla databáze znovu vytvořit
//                TestMapStorage(target);
//            }
//        }

//        public void TestMapStorage(MapStorageContext context)
//        {
//            using (MapStorageContext target = new MapStorageContext())
//            {
//                target.Database.Delete(); //smaže db po předchozím testu
//                var storage = new MapStorage(null, target);

//                storage.AddToCache("Moje mapa", new TileId(1, 1, 1), new BitmapImage(GetPath("20.png")), DateTime.Now);
//                storage.AddToCache("Moje mapa", new TileId(1, 1, 2), new BitmapImage(GetPath("20.png")), DateTime.Now);
//                storage.AddToCache("Moje mapa", new TileId(1, 1, 1), new BitmapImage(GetPath("10.png")), DateTime.Now);
//                storage.AddToCache("Moje mapa2", new TileId(1, 1, 1), new BitmapImage(GetPath("10.png")), new DateTime(2000, 1, 1));
//                var r1 = storage.GetTile("Moje mapa", new TileId(1, 1, 1), false);
//                var r2 = storage.GetTile("Moje mapa", new TileId(1, 1, 2), true);
//                var r3 = storage.GetTile("Moje mapa2", new TileId(1, 1, 1), true); //existující, vypršela platnost ale přesto vrátí
//                var r4 = storage.GetTile("Moje mapa2", new TileId(1, 1, 1), false);//existující, vypršela platnost, vrátí null
//                var r5 = storage.GetTile("Moje mapa2", new TileId(9, 9, 9), true); //neexistující
//                Assert.AreEqual(r1.Tile.PixelHeight, 10);
//                Assert.AreEqual(r2.Tile.PixelHeight, 20);
//                Assert.AreEqual(r3.Tile.PixelHeight, 10);
//                Assert.IsFalse(r3.IsTileEmpty);
//                Assert.IsTrue(r4.IsTileEmpty);
//                Assert.IsNull(r4.Tile);
//                Assert.IsNull(r5.Tile);
//                Assert.IsTrue(r5.IsTileEmpty);
//            }
//        }

//        private Uri GetPath(string fileName)
//        {
//            var path = System.IO.Path.Combine(TestContext.TestDeploymentDir, fileName);
//            return new Uri(path);
//        }
//    }
//}